﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Helena.Models;
using Helena.Areas.Productos.Models;
using Helena.Areas.Vendedores.Models;
using Helena.Areas.Configuraciones.Models;
namespace Helena.Areas.Ventas.Models
{
    public class LogicaVenta:InterfazLogicaVenta
    {
        DBContext Venta_contexto = new DBContext();
        DBGenericQueriesUtil<Venta> Tabla;
        DBGenericQueriesUtil<DetalleVenta> tabla_detalle;
        DBGenericQueriesUtil<Producto> tabla_Producto;
        DBGenericQueriesUtil<DetalleProducto> tabla_Detalle_Producto;
        

        #region Comun

        LogicaConfiguraciones conf = new LogicaConfiguraciones();  
        public DBContext context_publico { get { return Venta_contexto; } }
        public LogicaVenta()
        {
            Tabla = new DBGenericQueriesUtil<Venta>(Venta_contexto, Venta_contexto.t_Venta);
            tabla_detalle = new DBGenericQueriesUtil<DetalleVenta>(Venta_contexto, Venta_contexto.t_DetalleVenta);
            tabla_Producto = new DBGenericQueriesUtil<Producto>(Venta_contexto, Venta_contexto.t_Productos);
            tabla_Detalle_Producto = new DBGenericQueriesUtil<DetalleProducto>(Venta_contexto, Venta_contexto.t_DetalleProductos);
        } 
        public int i_AgregarVenta(VentaView venta)
        {
            return Tabla.agregarElemento(venta.deserializa(this));
        }

        public void i_ModificarVenta(VentaView venta)
        {
            Venta v = venta.deserializa(this);
            Tabla.modificarElemento(v, v.ID);
        }
        public void i_EliminarVenta(int id)
        {
            Tabla.eliminarElemento_logico(id);
        }
        public List<VentaView> i_RetornarVentas()
        {
            List<Venta> v = Tabla.retornarTodos();
            List<VentaView> v_v = new List<VentaView>();

            foreach (Venta venta in v)
                v_v.Add(new VentaView(venta));
            return v_v;
        }
        public VentaView i_RetornarVenta(int id)
        {
            Venta v = Tabla.retornarUnSoloElemento(id);
            VentaView v_v = new VentaView(v);
            return v_v;
        }

        #endregion

        #region Detalles

        public List<DetalleVentaView> DetallesDeUnaVenta(int VentaID)
        {
            Venta VentaBase = Tabla.retornarUnSoloElemento(VentaID);

            IEnumerable<DetalleVenta> antes = from detalles in tabla_detalle.retornarTodos()
                                              where detalles.VentaID == VentaID && detalles.Estado == true
                                              select detalles;

            List<DetalleVenta> detallesDeUnaVenta = antes.ToList();
            List<DetalleVentaView> salida = new List<DetalleVentaView>();

            foreach (DetalleVenta uno in detallesDeUnaVenta)
                if (uno.Estado)
                {
                    DetalleVentaView temp = new DetalleVentaView(uno);
                    salida.Add(temp);
                }
            return salida;
        }

        public List<DetalleVentaView> DetallesDeUnaVenta2(int VentaID)
        {
            Venta VentaBase = Tabla.retornarUnSoloElemento(VentaID);

            IEnumerable<DetalleVenta> antes = from detalles in tabla_detalle.retornarTodos()
                                              where detalles.VentaID == VentaID
                                              select detalles;

            List<DetalleVenta> detallesDeUnaVenta = antes.ToList();
            List<DetalleVentaView> salida = new List<DetalleVentaView>();

            foreach (DetalleVenta uno in detallesDeUnaVenta)
            {
                DetalleVentaView temp = new DetalleVentaView(uno);
                salida.Add(temp);
            }
            return salida;
        }

        public void AgregarDetalleaVenta(int id,DetalleVentaView dv)
        {
            bool pertenece = false;
            List<DetalleVentaView> detalles = DetallesDeUnaVenta(id);
            
            foreach (DetalleVentaView d in detalles)
            {
                if (d.ProductoID == dv.ProductoID)
                {
                    pertenece = true;
                }
            }

            if (pertenece == false)
            {
                tabla_detalle.agregarElemento(dv.deserializa(this));
            }

            //***********Resta a la tabla productos****************
            List<DetalleProducto> subproducto = tabla_Detalle_Producto.retornarTodos().Where(d => d.ProductoCID == dv.ProductoID).ToList();
            Producto producto = null;

            if (subproducto.Count == 0)
            {
                producto = tabla_Producto.retornarUnSoloElemento(dv.ProductoID);
                producto.cantidad = producto.cantidad - dv.Cantidad;
                tabla_Producto.modificarElemento(producto, producto.ID);
            }
            else
            {
                foreach (DetalleProducto dp in subproducto)
                {
                    producto = tabla_Producto.retornarUnSoloElemento(dp.ProductoID);
                    producto.cantidad = producto.cantidad - dv.Cantidad * dp.Cantidad;
                    tabla_Producto.modificarElemento(producto, producto.ID);
                }

                producto = tabla_Producto.retornarUnSoloElemento(dv.ProductoID);
                producto.cantidad = producto.cantidad - dv.Cantidad;
                tabla_Producto.modificarElemento(producto, producto.ID);
            }
            //*****************************************************
        }

        public void i_ModificarDetalle(int id, DetalleVentaView dv)
        {
            //ya no se usa xq esta en memoria
            tabla_detalle.modificarElemento(dv.deserializa(this),dv.ID);
        }

        public void i_EliminarDetalle(int id, DetalleVentaView dv)
        {
            tabla_detalle.eliminarElemento_logico(dv.ID);

            //***********Resta a la tabla productos****************
            List<DetalleProducto> subproducto = tabla_Detalle_Producto.retornarTodos().Where(d => d.ProductoCID == dv.ProductoID).ToList();
            Producto producto = null;

            if (subproducto.Count == 0)
            {
                producto = tabla_Producto.retornarUnSoloElemento(dv.ProductoID);
                producto.cantidad = producto.cantidad + dv.Cantidad;
                tabla_Producto.modificarElemento(producto, producto.ID);
            }
            else
            {
                foreach (DetalleProducto dp in subproducto)
                {
                    producto = tabla_Producto.retornarUnSoloElemento(dp.ProductoID);
                    producto.cantidad = producto.cantidad + dv.Cantidad * dp.Cantidad;
                    tabla_Producto.modificarElemento(producto, producto.ID);
                }

                producto = tabla_Producto.retornarUnSoloElemento(dv.ProductoID);
                producto.cantidad = producto.cantidad + dv.Cantidad;
                tabla_Producto.modificarElemento(producto, producto.ID);
            }
            //*****************************************************
        }

        #endregion

        #region Extras

        public int RetornarNextTicket()
        {
            var lista = (from n in context_publico.t_Venta select n.Ticket).ToList();
            int ticket = lista.Count>0?lista.Max()+1:1;
            return ticket;
        }

        public int RetornarNextBoleta()
        {
            var lista = (from n in context_publico.t_Venta select n.Boleta).ToList();
            int boleta = lista.Count > 0 ? lista.Max() + 1 : 1;
            return boleta;
        }

        public int RetornarNextFactura()
        {
            var lista = (from n in context_publico.t_Venta select n.Factura).ToList();
            int factura = lista.Count > 0 ? lista.Max() + 1 : 1;
            return factura;
        }

        #endregion
    }
}